package cn.tedu.design;
/*用于实现单例设计模式方案2:懒汉式
* 关于单例设计模式的两种实现方式
* 1.饿汉式:不管你用不用这个类的对象,都会先创建一个
* 2.懒汉式:先不给你创建对象,等你需要的时候再创建--延迟加载的思想
*
* 延迟加载的思想:是指不会在第一时间就把对象创建好占内存
*             而是什么时候用到,什么时候再创建对象
*线程安全问题:由于我们存在唯一的对象single2,并且多条语句都操作了这个变量
 * 所以,如果将程序放在多线程的环境下,就容易出现数据安全的问题,解决方案:
 * 1)将3条语句都使用同步代码块包裹,保证同步排队的效果
 * 2)由于getSing()方法里也只有这3条语句,所以也可以将本方法修饰为同步方法
 * 注意:被synchronized修饰的迭代称作同步方法,但是不推荐使用! */
public class Singleton2 {
    public static void main(String[] args) {
        Mysingle2 s1 =Mysingle2.getsingle();
        Mysingle2 s2 =Mysingle2.getsingle();
        System.out.println(s1);
        System.out.println(s2);
    }
}

class Mysingle2 {
    public Mysingle2() {
    }
    /*
    引用类型的成员变量,默认值null*/
    static Mysingle2 single2;
    static Object o=new Object();
    static public Mysingle2 getsingle() {
        synchronized (o) {
            if (single2 == null) {
                /*调用时再创建对象*/
                single2 = new Mysingle2();
            }
            return single2;
        }
    }
}